package com.hsurosy.hsuchain.nft.api.collection.service;

import com.hsurosy.hsuchain.nft.api.collection.model.CollectionInventoryVO;
import com.hsurosy.hsuchain.nft.api.collection.model.CollectionVO;
import com.hsurosy.hsuchain.nft.api.collection.model.HeldCollectionVO;
import com.hsurosy.hsuchain.nft.api.collection.request.*;
import com.hsurosy.hsuchain.nft.api.collection.response.CollectionDestroyResponse;
import com.hsurosy.hsuchain.nft.api.collection.response.CollectionSaleResponse;
import com.hsurosy.hsuchain.nft.api.collection.response.CollectionTransferResponse;

/**
 * 藏品门面服务接口
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-04 14:54
 * @Description
 * @Version: v1.0.0
 */
public interface CollectionFacadeService {

    /**
     * 藏品出售的 try 阶段，预占用库存
     *
     * @param request 藏品出售请求
     * @return 藏品出售响应
     */
    CollectionSaleResponse trySale(CollectionSaleRequest request);

    /**
     * 藏品出售的 confirm 阶段，真正售出
     *
     * @param request 藏品出售请求
     * @return 藏品出售响应
     */
    CollectionSaleResponse confirmSale(CollectionSaleRequest request);

    /**
     * 藏品出售的 cancel 阶段，退还库存
     *
     * @param request 藏品取消出售请求
     * @return 藏品取消出售响应
     */
    CollectionSaleResponse cancelSale(CollectionSaleRequest request);

    /**
     * 转移藏品
     *
     * @param request 藏品转移请求
     * @return 藏品转移响应
     */
    CollectionTransferResponse transfer(CollectionTransferRequest request);

    /**
     * 销毁藏品
     *
     * @param request 藏品销毁请求
     * @return 藏品销毁响应
     */
    CollectionDestroyResponse destroy(CollectionDestroyRequest request);

    /**
     * 根据 ID 查询藏品
     *
     * @param collectionId 藏品ID
     * @return 藏品查询响应
     */
    public SingleResponse<CollectionVO> queryById(Long collectionId);

    /**
     * 预扣减库存
     *
     * @param collectionId 藏品ID
     * @param quantity     扣减数量
     * @param identifier   唯一标识
     * @return 扣减库存响应
     */
    public SingleResponse<Boolean> preInventoryDeduct(Long collectionId, int quantity, String identifier);

    /**
     * 查询藏品库存
     *
     * @param collectionId 藏品ID
     * @return 藏品库存查询响应
     */
    public SingleResponse<CollectionInventoryVO> queryInventory(Long collectionId);

    /**
     * 藏品分页查询
     *
     * @param request 藏品分页查询请求
     * @return 藏品分页查询响应
     */
    public PageResponse<CollectionVO> pageQuery(CollectionPageQueryRequest request);

    /**
     * 持有藏品分页查询
     *
     * @param request 持有藏品分页查询请求
     * @return 持有藏品分页查询响应
     */
    public PageResponse<HeldCollectionVO> pageQueryHeldCollection(HeldCollectionPageQueryRequest request);

    /**
     * 根据 ID 查询持有藏品
     *
     * @param heldCollectionId 持有藏品ID
     * @return 持有藏品查询响应
     */
    public SingleResponse<HeldCollectionVO> queryHeldCollectionById(Long heldCollectionId);
}
